﻿/*
 * Copyright (c) 2016 The ZLToolKit project authors. All Rights Reserved.
 *
 * This file is part of ZLToolKit(https://github.com/ZLMediaKit/ZLToolKit).
 *
 * Use of this source code is governed by MIT license that can be found in the
 * LICENSE file in the root of the source tree. All contributing project authors
 * may be found in the AUTHORS file in the root of the source tree.
 */

#ifndef UTIL_WORKTHREADPOOL_H_
#define UTIL_WORKTHREADPOOL_H_

#include <memory>
#include "Poller/EventPoller.h"

namespace toolkit {

/**
 * 工作线程池类
 * 用于管理一组EventPoller线程，提供任务调度和执行功能
 * 继承自std::enable_shared_from_this以支持智能指针
 * 继承自TaskExecutorGetterImp以提供任务执行器获取功能
 */
class WorkThreadPool : public std::enable_shared_from_this<WorkThreadPool>, public TaskExecutorGetterImp {
public:
    using Ptr = std::shared_ptr<WorkThreadPool>;  // 智能指针类型定义

    /**
     * 析构函数
     */
    ~WorkThreadPool() override = default;

    /**
     * 获取工作线程池的单例实例
     * @return 工作线程池的引用
     */
    static WorkThreadPool &Instance();

    /**
     * 设置EventPoller线程的数量
     * 此方法必须在WorkThreadPool单例创建前调用才有效
     * 如果不调用此方法，默认创建thread::hardware_concurrency()个EventPoller实例
     * @param size EventPoller线程数量，如果为0则使用thread::hardware_concurrency()
     */
    static void setPoolSize(size_t size = 0);

    /**
     * 设置是否启用CPU亲和性
     * 默认情况下会设置CPU亲和性，以提高性能
     * @param enable 是否启用CPU亲和性
     */
    static void enableCpuAffinity(bool enable);

    /**
     * 获取第一个EventPoller实例
     * @return EventPoller的智能指针
     */
    EventPoller::Ptr getFirstPoller();

    /**
     * 根据负载情况获取负载较轻的EventPoller实例
     * 如果优先返回当前线程，则会返回当前线程
     * 返回当前线程的目的是为了提高线程安全性
     * @return EventPoller的智能指针
     */
    EventPoller::Ptr getPoller();

protected:
    /**
     * 构造函数
     * 初始化工作线程池
     */
    WorkThreadPool();
};

} /* namespace toolkit */
#endif /* UTIL_WORKTHREADPOOL_H_ */
